<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>判断js类型的方式</title>
	</head>
	<body>
		<script type="text/javascript">
			// 先引出2个概念
			/*
				1、基本数据类型（存放在栈中）：Undefined、Null、Boolean、Number、String、Symbol (ES6新增)
				2、引用数据类型（存放在堆内存中的对象，每个空间大小不一样，要根据情况进行特定的配置）：Object 类型 【Object类型、Array类型、Date类型、RegExp类型、Function类型】
				引用类型的值是保存在 堆内存（Heap）中的对象（Object）
				与其他编程语言不同，JavaScript 不能直接操作对象的内存空间（堆内存）
			*/
		   // 1、typeof
		   let  a = [1,2,3,4],
				b = 5,
				c = 'test',
				d = function() {
					console.log('我是函数')
				},
				e = true,
				f = null,
				g;
				h = Symbol(42);
				j = new Date()
				console.log(typeof(a)); // object
				console.log(typeof(b)); // number
				console.log(typeof(c)); // string
				console.log(typeof(d)); // function
				console.log(typeof(e)); // boolean
				console.log(typeof(f)); // object
				console.log(typeof(g)); // undefined
				console.log(typeof(h)); // symbol
				console.log(typeof(j)); // object
			// 2、instanceof 判断该对象是谁的实例;内部机制是通过判断对象的原型链上是否能找到对象的proptype; 
			// object instanceof constructor
			console.log({} instanceof Object)              // true
			console.log([] instanceof Array)               // true
			console.log(/aa/g instanceof RegExp)           // true
			console.log(function(){} instanceof Function)  // true
			// 3、 js原生方法 Object.prototype.toString.call()常用于判断浏览器内置对象 它可以给出数据的确切类型，相比typeof要精确
			// 面试点：实现一个函数clone，可以对js中的5种主要的数据类型（包括number string object array Boolean）进行值复制 
			
			console.log(Object.prototype.toString.call(a)) // [object Array]
			console.log(Object.prototype.toString.call(b)) // [object Number]
			console.log(Object.prototype.toString.call(c)) // [object String]
			console.log(Object.prototype.toString.call(d)) // [object Function]
			console.log(Object.prototype.toString.call(e)) // [object Boolean]
			console.log(Object.prototype.toString.call(f)) // [object Null]
			console.log(Object.prototype.toString.call(g)) // [object Undefined]
			console.log(Object.prototype.toString.call(h)) // [object Symbol]
			console.log(Object.prototype.toString.call(j)) // [object Date]
			// 4.判断是否为数组 Array.isArray() [IE8及以下版本不支持此API] 还需要用到 Object.prototype.toString.call(arr) === "[object Array]";
		</script>
	</body>
</html>
